The growth rate of network traffic continues to strain the infrastructure that carries that traffic. Various solutions have arisen to permit network operators to handle this increasing problem, including the development of caching technology. With traditional caching, static content can be reused and served to multiple clients without burdening server infrastructure. Additionally, cache memories permit static content to be stored closer to the end user, thereby improving response time while at the same time reducing server infrastructure burden. Lowered response times and lowered server infrastructure load reduces bandwidth and the processing requirements of such infrastructure.
However, an increasing amount of the content delivered across networks is dynamically generated, including a large percentage of network traffic created by enterprise computing solutions and complex internet applications. Dynamically generated content is content generated by the server at the time an object is requested, and is often based on inputs received from the client. Therefore, it frequently changes both through time and with respect to inputs made to the generating system. Common examples of dynamic content include where a stock quotation request made by a client or database searches. In each instance, the response object is generated in real time following receipt of a specific, client request.
The challenges to caching dynamically generated content are manifold. For example, there are no generally-accepted standards or specifications for caching dynamically generated content. Since there exists no standard for designating whether a dynamically generated object may be cached, such objects are typically treated as non-cacheable. Another challenge is determining the validity of “freshness” of a dynamically generated object because changes to the underlying data used to generate such objects may be irregular and unpredictable.
In addition to the above difficulties, requests for dynamically generated content are also typically more complex than requests for static content. Dynamic requests often contain a string of information that needs to be processed or parsed by the destination application to identify applicable parameters that will be used by the cache to identify the appropriate object related to such request. These parameters, however, are rarely placed in the request in a logical or consistent order by the client. To determine which of the multitude of dynamically generated objects is identified by the request, each such request must be normalized (i.e., place the parameters in non-arbitrary order).
Furthermore, matching a request to a dynamically generated object becomes a much more complex task with dynamically generated content because certain processing done by the application may need to be duplicated or otherwise anticipated, by making an educated guess. This duplication or guessing is necessary to decide whether an object stored by the cache is appropriate for serving to a particular incoming request. The complexity arises as a result of the complexity of the applications themselves, and also because the contents of the response can be a function of both the contents of the request, as well as certain other external variables like the user-identity (which may or may not be present in the request), the time of the day, the current state of the user database and a myriad of other factors.
In summary, caching originally developed around the caching of static objects. As the Internet and applications becomes more and more dependent upon delivering dynamically generated content, the need has arisen for a solution that extends the benefits of caching to dynamic content, and that solves the variety of challenges such content presents for traditional caching technology.